/**********************************************************************
* COPYRIGHT NOTICE - HYPERSEN TECHNOLOGY
*
* Copyright (c) 2025 , Hypersen Technology, Inc.
*
* All rights reserved.
*
*======================================================================
* @projectName Theme
* @file thememanager.h
* @brief 主题管理器
* @author   Jay
* @email    none
* @version  1.0.0
* @date     2025-10-08
* @license private & classified
*---------------------------------------------------------------------
* Remark:
* 【调用方式-1 无界面】
    // 初始化主题管理器
    ThemeManager::instance().initialize();
    // 设置主题
    ThemeManager::instance().setTheme(ThemeManager::ThemeQssEnum::Green);

    // 连接主题切换信号
    connect(&ThemeManager::instance(), &ThemeManager::themeChanged, this, [this](const QString& themeName) {
        QMessageBox::information(this, "主题", QString("当前主题 '%1' ").arg(themeName));
    });
* 【调用方式-2 有界面推荐】
    // 主题选择器
    ThemeSelector* selector = new ThemeSelector(this);
    // 显示窗口设置
    selector->show();
    selector->activateWindow();
    connect(selector, &ThemeSelector::themeSelected, this, [](const QString& themeName) {
        ThemeManager::instance().setTheme(themeName);
    });
*======================================================================
* Change History:
*---------------------------------------------------------------------
* <Date>      | <Version>  | <Author>  | <Description>
*---------------------------------------------------------------------
* 2025-10-08  | V1.0.0     | Jay       | 主题管理器
**********************************************************************/
#ifndef THEME_MANAGER_H
#define THEME_MANAGER_H

#include <QApplication>
#include <QObject>
#include <QPalette>
#include <QMap>
#include <QString>
#include <QSettings>
#include <QFile>
#include <QColor>
#include <QDebug>
#include <QMetaEnum>
#include <QMetaObject>

/** 主题管理器 */
class ThemeManager : public QObject
{
    Q_OBJECT

public:
    // 获取单例实例
    static ThemeManager& instance() {
        static ThemeManager instance;
        return instance;
    }

    enum class ThemeQssEnum
    {
        Default,
        Dark,
        Light,
        Blue,
        Green
    };
    Q_ENUM(ThemeQssEnum)

    // 转换函数
    static QString themeToString(ThemeQssEnum theme)
    {
        // 使用QMetaEnum::fromType()更简单直接
        QMetaEnum metaEnum = QMetaEnum::fromType<ThemeQssEnum>();
        return QString(metaEnum.valueToKey(static_cast<int>(theme)));
    }

    // 初始化主题管理器
    void initialize();

    // 设置主题
    bool setTheme(const QString& themeName);
    // 设置主题
    bool setTheme(ThemeManager::ThemeQssEnum theme);

    // 获取当前主题名称
    QString currentTheme() const;
    // 获取所有可用主题名称
    QStringList availableThemes() const;

    // 检查主题是否存在
    bool themeExists(const QString& themeName) const;

    // 保存当前主题设置
    void saveCurrentTheme();
    // 加载保存的主题设置
    void loadSavedTheme();
    // 检测系统主题
    void detectSystemTheme();
    // 应用系统主题
    void applySystemTheme();

    // 获取当前调色板
    QPalette currentPalette() const;
    // 获取当前样式表
    QString currentStyleSheet() const;

signals:
    void themeChanged(const QString& newTheme);

private:
    ThemeManager(QObject* parent = nullptr);  // 修改构造函数，允许指定父对象
    ~ThemeManager() = default;
    ThemeManager(const ThemeManager&) = delete;
    ThemeManager& operator=(const ThemeManager&) = delete;

    // 初始化内置主题
    void initializeBuiltInThemes();

    // 应用主题
    void applyTheme(const QString& themeName);

    // 从文件加载样式表
    QString loadStyleSheet(const QString& filePath);

    // 内置主题名称
    const QString DEFAULT_THEME = "Default";
    const QString DARK_THEME = "Dark";
    const QString LIGHT_THEME = "Light";
    const QString BLUE_THEME = "Blue";
    const QString GREEN_THEME = "Green";

    // 当前主题名称
    QString m_currentTheme;

    // 主题映射表
    QMap<QString, QPalette> m_palettes;         // 例：dark，darkPalette
    QMap<QString, QString> m_styleSheets;       // 例：dark，":/qss/dark.css"
    QMap<QString, QString> m_themeDescriptions; // 例：dark，"Dark theme"
};

#endif // THEME_MANAGER_H
